/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelos;

import conexion.CRUD;
import conexion.Conexion;
import enumeraciones.eFacultad;
import global.DatosGlobales;
import interfaces.modelo;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Luis
 */
public class Carrera implements modelo{
    
    public static String TABLA = "carreras";
    public static String SP = "SP_carreras";
    
    private Integer idCarrera;
    public static final String PROP_IDCARRERA = "idCarrera";
    
    private String nombre;
    public static final String PROP_NOMBRE = "nombre";
    
    private String descripcion;
    public static final String PROP_DESCRIPCION = "descripcion";
    
    private eFacultad idFacultad;
    public static final String PROP_IDFACULTAD = "idFacultad";
    
     private Boolean nuevo = Boolean.TRUE;

    public Carrera() {
        idCarrera=0;
    }
    
    

    public Carrera(Integer idCarrera, String nombre, String descripcion, eFacultad idFacultad) {
        this.idCarrera = idCarrera;
        this.nombre = nombre;
        this.descripcion = descripcion;
        this.idFacultad = idFacultad;
    }


    
    
    public eFacultad getIdFacultad() {
        return idFacultad;
    }


    public void setIdFacultad(eFacultad idFacultad) {
        eFacultad oldIdFacultad = this.idFacultad;
        this.idFacultad = idFacultad;
        propertyChangeSupport.firePropertyChange(PROP_IDFACULTAD, oldIdFacultad, idFacultad);
    }

 
    public String getDescripcion() {
        return descripcion;
    }


    public void setDescripcion(String descripcion) {
        String oldDescripcion = this.descripcion;
        this.descripcion = descripcion;
        propertyChangeSupport.firePropertyChange(PROP_DESCRIPCION, oldDescripcion, descripcion);
    }


   
    public String getNombre() {
        return nombre;
    }

  
    public void setNombre(String nombre) {
        String oldNombre = this.nombre;
        this.nombre = nombre;
        propertyChangeSupport.firePropertyChange(PROP_NOMBRE, oldNombre, nombre);
    }


 
    public Integer getIdCarrera() {
        return idCarrera;
    }


    public void setIdCarrera(Integer idCarrera) {
        Integer oldIdCarrera = this.idCarrera;
        this.idCarrera = idCarrera;
        propertyChangeSupport.firePropertyChange(PROP_IDCARRERA, oldIdCarrera, idCarrera);
    }
    private transient final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);


    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }


    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    @Override
    public void guardar() {
         try{
        Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
        String proc = "begin "+Carrera.SP+"(?,?,?,?,?,?); end;";
        CallableStatement prepareCall = con.getConexionOracle().prepareCall(proc);
        int i =1;
        if(getNuevo()){
            prepareCall.setInt(i++, CRUD.Insert.getOpcion());
        }else{
            prepareCall.setInt(i++, CRUD.Update.getOpcion());
        }
        prepareCall.setInt(i++, this.getIdCarrera());
        prepareCall.setString(i++, this.getNombre());
        prepareCall.setString(i++, this.getDescripcion());
        prepareCall.setInt(i++, this.getIdFacultad().getIdFacultad());
        prepareCall.setInt(i++, DatosGlobales.getInstance().getFacultad().getIdFacultad());
        prepareCall.execute();
        }catch(Exception ex){
            System.out.println("Excepcion" + ex);
        }
    }

    @Override
    public void eliminar() {
        try{
        Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
        String proc = "begin "+Carrera.SP+"(?,?,?,?,?,?); end;";
        CallableStatement prepareCall = con.getConexionOracle().prepareCall(proc);
        int i =1;
        prepareCall.setInt(i++, CRUD.Delete.getOpcion());
        prepareCall.setInt(i++, this.getIdCarrera());
        prepareCall.setString(i++, this.getNombre());
        prepareCall.setString(i++, this.getDescripcion());
        prepareCall.setInt(i++, this.getIdFacultad().getIdFacultad());
        prepareCall.setInt(i++, DatosGlobales.getInstance().getFacultad().getIdFacultad());
        prepareCall.execute();
        }catch(Exception ex){
            System.out.println("Excepcion" + ex);
        }
           
    }
    
    public static List<Carrera> getCarreras(String where){
        List<Carrera> result = new ArrayList<Carrera>();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521,  DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Carrera.TABLA);
            while (rs.next()) {
                result.add(Carrera.makeCarrera(rs));
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
    public static Carrera getCarreraById(Integer id){
        Carrera result = new Carrera();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521,  DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Carrera.TABLA);
            while (rs.next()) { 
                result = Carrera.makeCarrera(rs);
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
    private static Carrera makeCarrera(ResultSet rs) throws SQLException{
        Carrera result = null;
                int i =1;
                Integer  idCarrera = rs.getInt(i++);
                String nombre = rs.getString(i++);
                String descripcion = rs.getString(i++);
                eFacultad facultad = eFacultad.valorDe(rs.getInt(i++));
                result = new Carrera(idCarrera, nombre, descripcion, facultad);
                result.setNuevo(Boolean.FALSE);
        return result;
    }
    
    public String toString(){
        return ""+getNombre();
    }

    /**
     * @return the nuevo
     */
    public Boolean getNuevo() {
        return nuevo;
    }

    /**
     * @param nuevo the nuevo to set
     */
    public void setNuevo(Boolean nuevo) {
        this.nuevo = nuevo;
    }

    
}
